package design.behavior_method;

import org.junit.Test;

public class DemoMethod {
    @Test
    public void test() {
        ConcreteTemplate concreteTemplate=new ConcreteTemplate();
        concreteTemplate.templateMethod();
    }

    public class ConcreteTemplate extends AbstractTemplate {
        @Override
        protected void abstractMethod() {
            System.out.println("子类实现模板方法中的抽象方法...");
        }
    }

    public abstract class AbstractTemplate {
        /**
         * 模板方法：方法里面可以定义抽象方法，钩子方法或具体方法
         */
        public void templateMethod(){
            abstractMethod();
            doHookMethod();
            concreteMethod();
        }

        /**
         * 抽象方法：一个抽象方法由抽象类声明，子类必须实现。
         */
        protected abstract void abstractMethod();

        /**
         * 钩子方法：一般以do开头，子类可以选择性的重写
         */
        protected void doHookMethod(){}

        /**
         * 具体方法：一个具体方法由抽象类声明并实现，而子类并不实现或置换。
         */
        protected final void concreteMethod(){
            System.out.println("模板方法中的具体方法，不能被子类重写");
        }
    }
}
